package com.itheima.service.cargo.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itheima.dao.cargo.ContractDao;
import com.itheima.dao.cargo.ExtCproductDao;
import com.itheima.domain.cargo.Contract;
import com.itheima.domain.cargo.ExtCproduct;
import com.itheima.domain.cargo.ExtCproductExample;
import com.itheima.service.cargo.ExtCproductService;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

@Service
public class ExtCproductServiceImpl implements ExtCproductService {

    @Autowired
    private ExtCproductDao extCproductDao;

    @Autowired
    private ContractDao contractDao;

    public void save(ExtCproduct extCproduct) {
        //1、传入的参数是附件实体类，设置id（在Controller里，企业信息）
        //2、通过extCproduct.getCnumer*extCproduct.getPrice得到金额
        double amount = 0.0d;
        if (extCproduct.getCnumber()!=null&&extCproduct.getPrice()!=null){
            amount = extCproduct.getCnumber() * extCproduct.getPrice();
        }
        //3、设置附件金额
        extCproduct.setAmount(amount);
        //4、通过附件的合同id查找合同实体类（extCproduct.getContractId()）
        Contract contract = contractDao.selectByPrimaryKey(extCproduct.getContractId());
        //5、计算合同的附件数量：合同本身的附件数量 + 本次附件的数量
        //6、设置合同附件数量
        if (contract.getExtNum()!=null){
            contract.setExtNum(contract.getExtNum() + extCproduct.getCnumber());
        }else {
            contract.setExtNum(extCproduct.getCnumber());
        }
        //7、计算合同的总金额： 合同本身的总金额 + 本次附件的金额
        //8、设置合同的总金额
        if (contract.getTotalAmount()!=null){
            contract.setTotalAmount(contract.getTotalAmount() + amount);
        }else {
            contract.setTotalAmount(amount);
        }
        //9、保存附件到数据库
        extCproductDao.insertSelective(extCproduct);
        //10、更新合同到数据库
        contractDao.updateByPrimaryKeySelective(contract);
    }

    public void update(ExtCproduct extCproduct) {
        //1、传入的参数是附件实体类
        //2、通过extCproduct.getCnumer*extCproduct.getPrice得到金额
        double amount = 0.0d;
        if (extCproduct.getCnumber()!=null&&extCproduct.getPrice()!=null){
            amount = extCproduct.getCnumber() * extCproduct.getPrice();
        }
        //3、设置附件金额
        extCproduct.setAmount(amount);
        //4、通过附件的合同id查找合同实体类（extCproduct.getContractId()）
        Contract contract = contractDao.selectByPrimaryKey(extCproduct.getContractId());
        //5、通过附件实体类的id查找原来附件的实体类
        ExtCproduct oldExtc = extCproductDao.selectByPrimaryKey(extCproduct.getId());
        //6、计算合同的附件数量：合同本身的附件数量 - 原来附件的数量 + 本次附件的数量
        //7、设置合同附件数量
        contract.setExtNum(contract.getExtNum() - oldExtc.getCnumber() + extCproduct.getCnumber());
        //8、计算合同的总金额： 合同本身的总金额 - 原来附件的金额 + 本次附件的金额
        //9、设置合同的总金额
        contract.setTotalAmount(contract.getTotalAmount() - oldExtc.getAmount() + amount);
        //10、更新附件到数据库
        extCproductDao.updateByPrimaryKeySelective(extCproduct);
        //11、更新合同到数据库
        contractDao.updateByPrimaryKeySelective(contract);
    }

    public void delete(String id) {
        //1、通过id查找附件实体类
        ExtCproduct extCproduct = extCproductDao.selectByPrimaryKey(id);
        //2、通过附件实体类查找合同实体类
        Contract contract = contractDao.selectByPrimaryKey(extCproduct.getContractId());
        //3、计算合同的附件数量：合同本身的附件数量 - 本次附件的数量
        //4、设置合同的附件数量
        contract.setExtNum(contract.getExtNum() - extCproduct.getCnumber());
        //5、计算合同的总金额：合同本身的总金额 - 本次附件的金额
        //6、设置合同的总金额
        contract.setTotalAmount(contract.getTotalAmount() - extCproduct.getAmount());
        //7、更新合同到数据库
        contractDao.updateByPrimaryKeySelective(contract);
        //8、通过id删除附件
        extCproductDao.deleteByPrimaryKey(id);
    }

    public ExtCproduct findById(String id) {
        return extCproductDao.selectByPrimaryKey(id);
    }

    public PageInfo findAll(ExtCproductExample example, int page, int size) {
        PageHelper.startPage(page, size);
        List<ExtCproduct> list = extCproductDao.selectByExample(example);
        return new PageInfo(list);
    }
}
